# 收集汇总多张表格的脚本文件

import os

from openpyxl import load_workbook
from openpyxl.styles import Font, PatternFill

import argparse

from spread_sheet import Spreadsheet  # type: ignore

DEFAULT_FONT = Font(bold=False, color="000000", size=9)
MODIFY_FONT = Font(bold=True, color="FF0000", size=9)
FILL_YELLOW = PatternFill(start_color="FFFF00", end_color="FFFF00", fill_type="solid")


def build_font(size):
    default = Font(bold=False, color="000000", size=size)
    modify = Font(bold=True, color="FF0000", size=size)

    return {
        "default": default,
        "modify": modify,
    }


def build_target(month):
    绿色铝 = {
        "start_row": 6,
        "max_col": 20,
        "target": f"填{month}月数据-XX县市区-附件3：云南省绿色铝产业建成企业运行情况调度表.xlsx",
    }

    能源外工业预计 = {
        "start_row": 5,
        "max_col": 28,
        "target": f"填{month}月预计数据-XX县市区-能源外工业投资情况预计情况表.xlsx",
    }

    能源外工业5亿元 = {
        "start_row": 6,
        "max_col": 20,
        "target": f"填{month}月数据-XX县市区-2024年能源以外工业项目投资情况统计表（5亿元以上项目）.xlsx",
    }

    新能源电池企业 = {
        "start_row": 5,
        "max_col": 18,
        "target": f"填{month}月数据-XX县市区-附件1：2024年新能源电池产业企业运行调度表.xlsx",
    }

    新能源电池项目 = {
        "start_row": 5,
        "max_col": 21,
        "target": f"填{month}月数据-XX县市区-附件2：2024年新能源电池产业投资项目调度表（汇总).xlsx",
    }

    工业投资预计 = {
        "start_row": 4,
        "max_col": 15,
        "target": f"填{month}月预计数据-XX县市区-工业投资运行预计.xlsx",
    }

    return {
        "绿色铝": 绿色铝,
        "能源外工业5亿元": 能源外工业5亿元,
        "能源外工业预计": 能源外工业预计,
        "新能源电池企业": 新能源电池企业,
        "新能源电池项目": 新能源电池项目,
        "工业投资预计": 工业投资预计,
    }


def build_month_dict(month):
    绿色铝 = {
        "A2": f"云南省绿色铝产业建成企业运行情况调度表（2024年{month}月）",
        "J4": f"2024年{month}月产量",
        "L4": f"2024年1-{month}月累计产量",
        "N4": f"2024年{month}月产值",
        "P4": f"2024年1-{month}月累计产值",
        "H20": f"表中数据为上月，请更新为{month}月数据",
    }

    能源外工业5亿元 = {
        "A2": f"云南省各州（市）2024年能源外工业项目投资情况调度表（{month}月）",
        "K3": f"填报日期：2024年{month}月20日",
        "L5": f"2023年1-{month}月完成投资",
        "N5": f"2024年1-{month}月预计完成投资",
    }

    能源外工业预计 = {
        "B2": f"1-{month}月",
        "F2": f"{month}月",
        "P4": f"{month}月预计完成投资（亿元）",
        "Q4": f"1-{month}月预计完成投资（亿元）",
        "R3": f"{month}月通过审核预计新增入库项目（个）",
        "T3": f"{month}月预计完成投资（亿元）",
        "U3": f"1-{month}月预计完成投资（亿元）",
        "H20": f"表中数据为上月，请更新为{month}月数据",
    }

    新能源电池企业 = {
        "I3": f"2024年{month}月产量",
        "K3": f"2024年1-{month}月累计产量",
        "M3": f"2024年{month}月产值",
        "O3": f"2024年1-{month}月累计产值",
    }

    新能源电池项目 = {
        "M4": f"2023年1-{month}月完成投资",
        "N4": f"2023年1-{month+1}月预计完成投资",
        "P4": f"2024年1-{month}月完成投资",
        "Q4": f"2024年{month+1}月预计完成投资",
    }

    工业投资预计 = {"A1": f"工业投资预计（{month}月）"}
    return {
        "绿色铝": 绿色铝,
        "能源外工业5亿元": 能源外工业5亿元,
        "能源外工业预计": 能源外工业预计,
        "新能源电池企业": 新能源电池企业,
        "新能源电池项目": 新能源电池项目,
        "工业投资预计": 工业投资预计,
    }


def parse_args():
    parser = argparse.ArgumentParser(description="汇总表格")
    parser.add_argument("--type", help="报表类型")
    parser.add_argument("--size", type=int, default=12, help="字号")
    parser.add_argument("--data", help="数据表格路径")
    parser.add_argument("--month", type=int, default=0, help="某月")
    parser.add_argument("template", help="表格模板路径")
    return parser.parse_args()


def try_file_path(file_path):
    """测试是否存在文件，如果存在，返回带括号的文件名"""
    tmp_path = file_path
    (root, ext) = os.path.splitext(file_path)
    i = 1
    while os.path.exists(tmp_path):
        tmp_path = f"{root}({i}){ext}"
        i += 1

    return tmp_path


class CollectWorkbook:
    def __init__(self, args):
        self.args = args
        self.wb = load_workbook(args.template, data_only=True)
        self.conf = build_target(self.args.month)[self.args.type]
        self.values = build_month_dict(self.args.month)[self.args.type]

    def fill_default(self):
        ws = self.wb.active
        for row in ws.iter_rows(
            min_row=self.conf["start_row"],
            max_row=200,
            max_col=self.conf["max_col"],
        ):
            for cell in row:
                ws[cell.coordinate].font = build_font(self.args.size)["default"]

    def fill_mod(self, mod_cells):
        ws = self.wb.active
        for co in mod_cells:
            ws[co].font = build_font(self.args.size)["modify"]

    def save_as(self, target_path):
        self.wb.save(try_file_path(target_path))

    def fill_month(self):
        ws = self.wb.active

        print("vs", self.values)

        for k, v in self.values.items():
            print("kv", k, v)
            ws[k].value = v

        target = self.conf["target"]
        self.fill_default()
        self.save_as(target)
        return target


def main():
    args = parse_args()

    print("args", args)

    left = CollectWorkbook(args)

    if args.month != 0:
        left.fill_month()
        quit()

    right_files = [os.path.join(args.data, x) for x in os.listdir(args.data)]

    left_sheet = Spreadsheet(left.wb)
    for f in right_files:
        print(f"比较 {f} 的差异")
        right_args = args
        right_args.template = f
        right = CollectWorkbook(right_args)
        right_sheet = Spreadsheet(right.wb)
        mod_cells = left_sheet.diff(
            right_sheet, left.conf["start_row"], left.conf["max_col"]
        )
        left.fill_mod(mod_cells)

    left.save_as(f"汇总-{args.type}.xlsx")
    print("Done")


if __name__ == "__main__":
    main()
